package ipl.projet.servlets;

import ipl.projet.domaine.Tir;
import ipl.projet.domaine.Vaisseau;
import ipl.projet.domaine.Partie;
import ipl.projet.domaine.Partie.Etat;
import ipl.projet.exceptions.CoordonneException;
import ipl.projet.exceptions.NotYourTurnException;
import ipl.projet.exceptions.PartieInconnueException;
import ipl.projet.exceptions.TirDupliqueException;
import ipl.projet.exceptions.UtilisateurPasDeLaPartie;
import ipl.projet.usecase.UccStarTrek;

import java.io.IOException;
import java.util.List;

import javax.ejb.EJB;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class PartieEnCours extends HttpServlet implements Servlet {
	private static final long serialVersionUID = 1L;

	@EJB
	private UccStarTrek ucc;

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {		
		HttpSession sessionTEST = request.getSession();
		if (sessionTEST == null || sessionTEST.getAttribute("login") == null) {
			response.sendRedirect(response
					.encodeRedirectURL("connexion.html?erreur=1"));
			return;
		}

		HttpSession session = request.getSession();
		String partie = (String) session.getAttribute("partie");
		String login = (String) session.getAttribute("login");
		String adversaire = null;
		boolean monTour = false;

		if (request.getParameter("ajax") != null) {
			try {
				Partie partieEnCours = ucc.getPartie(partie);
				if (partieEnCours.getEtat() == Etat.ANNULEE
						|| partieEnCours.getEtat() == Etat.EN_ATTENTE) {
					response.getWriter().write("KO");
					return;
				}
				if(partieEnCours.getEtat() == Etat.FINIE) {
					if(partieEnCours.getGagnant().getLogin().equals(login)) {
						response.getWriter().write("WIN");
						return;
					} else {
						response.getWriter().write("LOSE");
						return;
					}
				}
				if (partieEnCours.getEtat() == Etat.EN_COURS) {
					if (partieEnCours.getJoueurCourant().equals(login)) {
						response.getWriter().write("OK");
						return;
					} else {
						return;
					}
				}
			} catch (PartieInconnueException e) {
				response.getWriter().write("KO");
				return;
			}
		}
		
		try {
			Partie partieEnCours2 = ucc.getPartie(partie);
			if(partieEnCours2.getEtat() == Etat.FINIE) {
				if(partieEnCours2.getGagnant().getLogin().equals(login)) {
					response.sendRedirect(response
							.encodeRedirectURL("accueil.html?message=1"));
					return;
				} else {
					response.sendRedirect(response
							.encodeRedirectURL("accueil.html?message=2"));
					return;
				}
			}
		} catch (PartieInconnueException e2) {
			response.sendRedirect(response
					.encodeRedirectURL("accueil.html?message=3"));
			return;
		}

		if (request.getParameter("x") != null
				&& request.getParameter("y") != null) {
			int x = Integer.parseInt(request.getParameter("x"));
			int y = Integer.parseInt(request.getParameter("y"));
			try {
				ucc.tirer(partie, login, x, y);
				response.sendRedirect(response
						.encodeRedirectURL("partieEnCours.html"));
				return;
			} catch (PartieInconnueException e) {
				response.sendRedirect(response
						.encodeRedirectURL("accueil.html?erreur=3"));
				return;
			} catch (UtilisateurPasDeLaPartie e) {
				response.sendRedirect(response
						.encodeRedirectURL("accueil.html?erreur=3"));
				return;
			} catch (NotYourTurnException e) {
				response.sendRedirect(response
						.encodeRedirectURL("accueil.html?erreur=3"));
				return;
			} catch (CoordonneException e) {
				response.sendRedirect(response
						.encodeRedirectURL("accueil.html?erreur=3"));
				return;
			} catch (TirDupliqueException e) {

			}
		}

		try {
			Partie partieEnCours = ucc.getPartie(partie);
			if (partieEnCours.getJoueurCourant().equals(login)) {
				monTour = true;
			} else {
				monTour = false;
			}

			if (partieEnCours.getPremierJoueur().getLogin().equals(login))
				adversaire = partieEnCours.getSecondJoueur().getLogin();
			else
				adversaire = partieEnCours.getPremierJoueur().getLogin();
		} catch (PartieInconnueException e1) {
			response.sendRedirect(response
					.encodeRedirectURL("accueil.html?erreur=3"));
		}

		List<Vaisseau> mesVaisseaux = null;
		List<Vaisseau> sesVaisseaux = null;
		List<Tir> sesTirs = null;
		List<Tir> mesTirs = null;
		try {
			mesVaisseaux = ucc.listerVaisseaux(partie, login);
			sesVaisseaux = ucc.listerVaisseaux(partie, adversaire);
		} catch (PartieInconnueException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		sesTirs = ucc.listerTirs(partie, adversaire);
		mesTirs = ucc.listerTirs(partie, login);

		String monTableau[][] = new String[10][10];
		String sonTableau[][] = new String[10][10];
		for (int ligne = 0; ligne < 10; ligne++) {
			for (int colonne = 0; colonne < 10; colonne++) {
				monTableau[ligne][colonne] = null;
				sonTableau[ligne][colonne] = null;
			}
		}

		for (Vaisseau vaisseau : mesVaisseaux) {
			if (vaisseau.estPlace()) {
				int num = 1;
				boolean estHorizontal = vaisseau.estHorizontal();
				if (estHorizontal) {
					for (int i = vaisseau.getCoordonneeDebut().getX(); i <= vaisseau
							.getCoordonneeFIN().getX(); i++) {
						monTableau[vaisseau.getCoordonneeDebut().getY()][i] = vaisseau
								.getType().shipName() + "-h-" + num++;
					}
				} else {
					for (int i = vaisseau.getCoordonneeFIN().getY(); i >= vaisseau
							.getCoordonneeDebut().getY(); i--) {
						monTableau[i][vaisseau.getCoordonneeDebut().getX()] = vaisseau
								.getType().shipName() + "-v-" + num++;
					}
				}
			}
		}

		boolean touche = false;
		for(Tir tir : mesTirs) {
			for(Vaisseau vaisseau : sesVaisseaux) {
				if(vaisseau.estTouche(tir)) {
					sonTableau[tir.getCoordonneeTir().getY()][tir.getCoordonneeTir().getX()] = "explosion";
					touche = true;
				} 
			}
			if(!touche)
				sonTableau[tir.getCoordonneeTir().getY()][tir.getCoordonneeTir().getX()] = "miss";
			touche = false;
		}
		
		for(Tir tir : sesTirs) {
			for(Vaisseau vaisseau : mesVaisseaux) {
				if(vaisseau.estTouche(tir)) {
					monTableau[tir.getCoordonneeTir().getY()][tir.getCoordonneeTir().getX()] = "explosion";
					touche = true;
				}
			}
			if(!touche)
				monTableau[tir.getCoordonneeTir().getY()][tir.getCoordonneeTir().getX()] = "miss";
			touche = false;
		}
		
		
		String derniereAction = null;
		try {
			Partie partieEnCours = ucc.getPartie(partie);
			derniereAction = partieEnCours.getActionDernierJoueur();
		} catch (PartieInconnueException e) {
			response.sendRedirect(response
					.encodeRedirectURL("accueil.html?erreur=3"));
		}

		request.setAttribute("monTableau", monTableau);
		request.setAttribute("sonTableau", sonTableau);
		request.setAttribute("monTour", monTour);
		request.setAttribute("derniereAction", derniereAction);

		getServletContext().getNamedDispatcher("partieEnCours.html").forward(
				request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

	}
}
